package com.itheima;

import com.itheima.config.SpringConfig;
import com.itheima.dao.BookDao;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * 切入点表达式：要进行的增强的方法的描述方式
 * 描述方式一：可以定位到实现类中的某个方法
 * 描述方式二：可以定位到实现接口中的某个方法
 *
 * 表达式规格：   execution(访问修饰符 返回类型 包名.类名.方法名(形参) 异常名)
 *      execution(public User com.itheima.service.UserService.findById(int))
 *
 * 通配符：
 *      1. * :用于匹配单个的任意符号   execution(public * com.itheima.*.UserService.find*(*))      -->匹配以find开头的方法,一个参数
 *      2. ..:匹配任意个连续的符号    execution(public User com..UserService.findById(..))        -->任意个参数
 *      3. + :专用于匹配子类类型      execution(* *..*Service+.*(..))    -->匹配以Service结尾的方法的子类中任意方法
 *
 *
 * 书写技巧
 * 所有代码按照标准规范开发，否则以下技巧全部失效
 * 描述切入点通常描述接口，而不描述实现类
 * 访问控制修饰符针对接口开发均采用public描述( 可省略访问控制修饰符描述)
 * 返回值类型对于增删改类使用精准类型加速匹配，对于查询类使用*通配快速描述
 * 包名书写尽量不使用..匹配，效率过低，常用*做单个包描述匹配，或精准匹配
 * 接口名/类名书写名称与模块相关的采用*匹配，例如UserService书写成*Service，绑定业务层接口名
 * 方法名书写以动词进行精准匹配，名词采用*匹配，例如getByld书写成getBy*,selectAll书写成selectAl
 * 参数规则较为复杂，根据业务方法灵活调整
 * 通常不使用异常作为匹配规则
 */
public class App {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext cx = new AnnotationConfigApplicationContext(SpringConfig.class);

        BookDao bookDao = cx.getBean(BookDao.class);

        bookDao.save();
    }
}
